package org.study.util;

import lombok.*;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
 * https://www.cnblogs.com/suizhikuo/p/14848515.html
 * https://blog.csdn.net/weixin_42470983/article/details/104611253
 * <p>
 * Java 8 lambda 表达式不慌之 Collectors 中的统计、分组、排序等
 * summarizingInt：按int类型统计
 * maxBy：取最大
 * minBy：取最小
 * averagingInt、averagingLong、averagingDouble：取平均值
 * counting：计数
 * partitioningBy：分隔
 * groupingBy：分组
 * sorted：排序
 *
 * @author Administrator
 * @date 2021-11-22
 */
public class LambdaTests {
    static List<User> listUser = new ArrayList<>();

    static {
        listUser.add(new User("李白", 20, true));
        listUser.add(new User("杜甫", 40, true));
        listUser.add(new User("李清照", 18, false));
        listUser.add(new User("李商隐", 23, true));
        listUser.add(new User("杜牧", 39, true));
        listUser.add(new User("苏小妹", 16, false));
    }

    public static void main(String[] args) {
        testSummarizingInt();
        maxMinTest();

    }

    public static void testSummarizingInt() {
        // summarizingInt 按 int 类型统计：这里是按 int 统计，还有 summarizingLong、summarizingDouble 方法，跟这个类似
        IntSummaryStatistics summaryStatistics = listUser.stream().collect(Collectors.summarizingInt(User::getAge));
        // 年龄平均值：26.0
        System.out.println("年龄平均值：" + summaryStatistics.getAverage());
        // 人数：6
        System.out.println("人数：" + summaryStatistics.getCount());
        // 年龄最大值：40
        System.out.println("年龄最大值：" + summaryStatistics.getMax());
        // 年龄最小值：16
        System.out.println("年龄最小值：" + summaryStatistics.getMin());
        // 年龄总和：156
        System.out.println("年龄总和：" + summaryStatistics.getSum());
    }

    public static void maxMinTest() {
        // maxBy取最大/minBy取最小
        // 根据指定条件取最大值： 取年纪最大的人
        Optional<User> maxBy = listUser.stream().collect(Collectors.maxBy(Comparator.comparing((user) -> {
            return user.getAge();
        })));
        if (maxBy.isPresent()) {
            // 判断是否有值
            User user = maxBy.get();
            // 输出==》 最大年纪的人是:杜甫
            System.out.println("最大年纪的人是:" + user.getName());
        }

        // 根据指定条件取最小值： 取年纪最小的人
        Optional<User> minBy = listUser.stream().collect(Collectors.minBy(Comparator.comparing((user) -> {
            return user.getAge();
        })));
        if (minBy.isPresent()) {
            // 判断是否有值
            User user = minBy.get();
            // 输出==》 最小年纪的人是:苏小妹
            System.out.println("最小年纪的人是:" + user.getName());
        }
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class User implements Serializable {
    private String name;
    private Integer age;
    private Boolean gender;
}